#ifndef SYMBOLEVALUE_H
#define SYMBOLEVALUE_H


#include <string.h>
#include <iostream>
using namespace std;

#include "Symbole.h"
#include "Arbre.h"

/*! \file SymboleValue.h

    \brief La spécification de la classe SymboleValue

   

    Décrit la liste des méthodes et attributs associés à la classe SyboleValue

    \author Thomas Donzelle

    \date 16.12.2011

 */
/*! \class SymboleValue

    \brief La classe représentant les Symboles Values.

   

    Cette classe permet de représenter sous la forme d'un objet

    une variable de type SymboleValue. Les méthodes suivantes sont associées

    à un objet de type SymboleValue :

    \li afficher

    \li getValeur

    \li setValeur
 
    \li estDefini
 */
class SymboleValue : public Symbole,  // un symbole valué est un symbole qui a une valeur, définie ou pas
                     public Noeud  {  // et c'est aussi une feuille de l'arbre abstrait
public:
    
            /*! \fn SymboleValue(Symbole s)

                \brief Constructeur de la classe SymboleValue.

               

                Ce constructeur construit un symbole valué à partir d'un symbole existant s

                \param s - le symbole existant

             */
	  SymboleValue(Symbole s); // construit un symbole valué à partir d'un symbole existant s
	
           /*! \fn ~SymboleValue()

                \brief Destructeur de la classe SymboleValue.
               
           */
          
          ~SymboleValue( ) {}
          
            /*! \fn afficher(unsigned short indentation=0)

                \brief Affiche le symbole en tant que noeud de l'arbre.

               
                Cette methode affiche le symbole en tant que noeud de l'arbre.

                \param indentation - la valeur de l'indentation

             */
	  void        afficher (unsigned short indentation=0);                        // affiche le symbole en tant que noeud de l'arbre
	  
          /*! \fn inline int getValeur()

                \brief Retourne la valeur du symbole.

                \return la valeur du symbole.

             */
          inline int  getValeur()              { return valeur;                     } // accesseur
	  
          /*! \fn setValeur(int valeur);

             *  \brief Modifie la valeur

             

                La fonction permet de modifier la valeur d' un symbole value

            \param valeur - la nouvelle valeur a affecter

                 */
          inline void setValeur(int valeur)    { this->valeur=valeur; defini=true;  } // accesseur

          /*! \fn estDefini();

             *  \brief Test si la valeur est defini

             

                La fonction permet de tester si la valeur d' un symbole value est definit ou non

           \return vrai si la valeur est difinit faux sinon.

                 */
          
	  inline bool estDefini()              { return defini;                     } // accesseur

	  friend ostream & operator << (ostream & cout, SymboleValue symb); // affiche un symbole value sur cout

private:
	 /*! \var bool defini

               \brief  Contient la valeur minimale d'un entier.

             */
          bool defini;	// indique si la valeur du symbole est définie
    
          /*! \var int valeur

               \brief  Contient la valeur du symbole s'il est definit, sinon zero.

             */
	  int  valeur;	// valeur du symbole si elle est définie, zéro sinon

};

#endif /* SYMBOLEVALUE_H */
